/*
 * Universidad Del Valle de Guatemala
 * Algoritmos y Estructuras de Datos
 * Sección 20
 * Nombre: Jonathan Robles
 * No carnet: 10267
 */
package hoja5;
import java.util.Scanner;
import java.util.InputMismatchException;
import java.util.Random;

public class Hoja5 {
    
  
    public static void main(String[] args) 
    {
        ListaC<Integer> cola1=new ListaC<Integer>();
        ListaC<Integer> cola2=new ListaC<Integer>();
        ListaC<Integer> cola3=new ListaC<Integer>();
        ListaC<Integer> cola4=new ListaC<Integer>();
        int opcion; 
        int tiempo_promedio = 0;
        int t1 = 0;
        int tiempoActual = 0;
        Integer tCola =  new Integer(0); 
        Integer TiempoCola = 0;
        int tPCola = 0; 
        int tAhora = 0;
        int t2 = 0;
        int tTServicio = 0;
        int tPServicio;
        int tiempoCliente = 0;
        int tTotal = 0;
        int tPTotal;
        Random aleatorio = new Random();
        int cliente =1;
        int clientes = 1;
        Scanner teclado = new Scanner (System.in);
        do
        {
            menu();
            //-----------------------------------------------------------------------------
            //programacion defensiva
            opcion=(int)obtenerNum("\nIngrese la opcion que desee llevar a cabo: \n",false);
            if (opcion<0)
                opcion=0;
            //-----------------------------------------------------------------------------
            
            switch(opcion)
            {
                case 1:
                    if (t1!=0)
                    {
                        System.out.println("    El ingreso de clientes solo puede ser modificado una vez!");
                         System.out.println("      Presione ENTER para continuar");
                         teclado.nextLine();
                    }
                    else
                    {
                        System.out.println("\n   --------------------INGRESO DE CLIENTES AL BANCO--------------------- \n");
                        while(cliente <= 40 || t1<400)
                        {               
                            System.out.println("\n   El banco cuenta con un tiempo de atencion total de 400 minutos para 40 clientes. \n");
                            t1=(int)obtenerNum("   Ingrese el tiempo de llegada del cliente " + cliente + ": \n",false);
                            if (t1 <tiempoActual)
                            {
                                System.out.println("    ERROR: El tiempo debe ser mayor/igual a cero o al ultimo tiempo agregado. ");
                                System.out.println("      Presione ENTER para continuar");
                                teclado.nextLine();
                            }
                                else if (t1 == 400 || cliente ==40)
                             {
                                System.out.println("   Este es el ultimo cliente que puede entrar al banco.\n ");
                                System.out.println("      Presione ENTER para continuar");
                                teclado.nextLine();
                                t2 = aleatorio.nextInt(30) + 1; // [1, 30]
                                
                                if(cola1.size() <= cola2.size() && cola1.size() <= cola3.size() && cola1.size() <= cola4.size() )
                                {
                                    tCola =  0; 
                                    cola1.add(tCola);
                                    if((tAhora) <= (t1))
                                    {
                                        TiempoCola = TiempoCola +tCola;
                                        tTServicio = tTServicio + t2;
                                        tiempoCliente =  tCola + tTServicio;
                                        tTotal = tTotal + tiempoCliente;
                                        clientes = cliente;
                                        System.out.println("    El cliente" +cliente+" ha sido añadido a la cola 1");
                                        System.out.println("    Su tiempo en la cola es de " +TiempoCola+" minutos.\n");
                                        System.out.println("    El tiempo de transacción del cliente "+cliente+" es de "+t2+" minutos.\n");
                                    }
                                    if (tAhora > (t1))
                                    {
                                        tCola = (tAhora - t1);
                                        TiempoCola = TiempoCola +tCola;
                                        tTServicio = tTServicio + t2;
                                        tTotal = tTotal + tiempoCliente;
                                        clientes = cliente;
                                        System.out.println("    El cliente" +cliente+" ha sido añadido a la cola 1");
                                        System.out.println("    Su tiempo en la cola es de " +TiempoCola+" minutos\n");
                                        System.out.println("    El tiempo de transacción del cliente "+cliente+" es de "+t2+" minutos.\n");
                                    }
                                }
                                else if(cola2.size() < cola1.size() && cola2.size() <= cola3.size() && cola2.size() <= cola4.size() )
                                {
                                    tCola = 0;
                                    cola2.add(tCola);
                                    if((tAhora) <= (t1))
                                    {
                                        TiempoCola = TiempoCola +tCola;
                                        tTServicio = tTServicio + t2;
                                        tiempoCliente =  tCola + tTServicio;
                                        tTotal = tTotal + tiempoCliente;
                                        clientes = cliente;
                                        System.out.println("    El cliente" +cliente+" ha sido añadido a la cola 2");
                                        System.out.println("    Su tiempo en la cola es de " +tCola+" minutos\n");
                                        System.out.println("    El tiempo de transacción del cliente "+cliente+" es de "+t2+" minutos.\n");
                                    }
                                    else if (tAhora > (t1))
                                    {
                                        tCola = (tAhora - t1);
                                        TiempoCola = TiempoCola + tCola;
                                        tTServicio = tTServicio + t2;
                                        tTotal = tTotal + tiempoCliente;
                                        clientes = cliente;
                                        System.out.println("    El cliente" +cliente+" ha sido añadido a la cola 2");
                                        System.out.println("    Su tiempo en la cola es de " +tCola+" minutos\n");
                                        System.out.println("    El tiempo de transacción del cliente "+cliente+" es de "+t2+" minutos.\n");
                                    }
                                }
                                else if(cola3.size() < cola1.size() && cola3.size() < cola2.size() && cola3.size() <= cola4.size() )
                                {
                                    tCola = 0;
                                    cola3.add(tCola);
                                    if((tAhora) <= (t1))
                                    {
                                        TiempoCola = TiempoCola + tCola;
                                        tTServicio = tTServicio + t2;
                                        tiempoCliente =  tCola + tTServicio;
                                        tTotal = tTotal + tiempoCliente;
                                        clientes = cliente;
                                        System.out.println("    El cliente" +cliente+" ha sido añadido a la cola 3");
                                        System.out.println("    Su tiempo en la cola es de " +tCola+" minutos\n");
                                        System.out.println("    El tiempo de transacción del cliente "+cliente+" es de "+t2+" minutos.\n");
                                    }
                                    else if (tAhora > (t1))
                                    {
                                        tCola = (tAhora - t1);
                                        TiempoCola = TiempoCola + tCola;
                                        tTServicio = tTServicio + t2;
                                        tTotal = tTotal + tiempoCliente;
                                        clientes = cliente;
                                        System.out.println("    El cliente" +cliente+" ha sido añadido a la cola 3");
                                        System.out.println("    Su tiempo en la cola es de " +tCola+" minutos\n");
                                        System.out.println("    El tiempo de transacción del cliente "+cliente+" es de "+t2+" minutos.\n");
                                    }
                                }
                                else if(cola4.size() < cola1.size() && cola4.size() < cola2.size() && cola4.size() < cola3.size() )
                                {
                                    tCola = 0;
                                    cola4.add(tCola);
                                    if((tAhora) <= (t1))
                                    {
                                        TiempoCola = TiempoCola + tCola;
                                        tTServicio = tTServicio + t2;
                                        tiempoCliente =  tCola + tTServicio;
                                        tTotal = tTotal + tiempoCliente;
                                        clientes = cliente;
                                        System.out.println("    El cliente" +cliente+" ha sido añadido a la cola 4");
                                        System.out.println("    Su tiempo en la cola es de " +tCola+" minutos\n");
                                        System.out.println("    El tiempo de transacción del cliente "+cliente+" es de "+t2+" minutos.\n");
                                    }
                                    else if (tAhora > (t1))
                                    {
                                        tCola = (tAhora - t1);
                                        TiempoCola = TiempoCola + tCola;
                                        tTServicio = tTServicio + t2;
                                        tTotal = tTotal + tiempoCliente;
                                        clientes = cliente;
                                        System.out.println("    El cliente" +cliente+" ha sido añadido a la cola 4");
                                        System.out.println("    Su tiempo en la cola es de " +tCola+" minutos\n");
                                        System.out.println("    El tiempo de transacción del cliente "+cliente+" es de "+t2+" minutos.\n");
                                    }
                                }
                                cliente = 41;
                                System.out.println("      Presione ENTER para continuar");
                                teclado.nextLine();
                                tAhora = t1+t2;

                             }
                            else if (t1 > 400)
                            {
                                System.out.println("    Ha excedido el tiempo limite. El banco ha cerrado ");
                                System.out.println("      Presione ENTER para continuar");
                                teclado.nextLine();
                                cliente = 41;
                            }
                            else
                            {
                                t2 = aleatorio.nextInt(30) + 1; // [1, 30]
                                if(cola1.size() <= cola2.size() && cola1.size() <= cola3.size() && cola1.size() <= cola4.size() )
                                {
                                    tCola = 0; 
                                    cola1.add(tCola);
                                    if((tAhora) <= (t1))
                                    {
                                        TiempoCola = TiempoCola +tCola;
                                        tTServicio = tTServicio + t2;
                                        tiempoCliente =  tCola + tTServicio;
                                        tTotal = tTotal + tiempoCliente;
                                        clientes = cliente;
                                        System.out.println("    El cliente" +cliente+" ha sido añadido a la cola 1");
                                        System.out.println("    Su tiempo en la cola es de " +tCola+" minutos\n");
                                        System.out.println("    El tiempo de transacción del cliente "+cliente+" es de "+t2+" minutos.\n");
                                    }
                                    else if (tAhora > (t1))
                                    {
                                        tCola = (tAhora - t1);
                                        TiempoCola = TiempoCola +tCola;
                                        tTServicio = tTServicio + t2;
                                        tTotal = tTotal + tiempoCliente;
                                        clientes = cliente;
                                        System.out.println("    El cliente" +cliente+" ha sido añadido a la cola 1");
                                        System.out.println("    Su tiempo en la cola es de " +tCola+" minutos\n");
                                        System.out.println("    El tiempo de transacción del cliente "+cliente+" es de "+t2+" minutos.\n");
                                    }
                                }
                                else if(cola2.size() < cola1.size() && cola2.size() <= cola3.size() && cola2.size() <= cola4.size() )
                                {
                                    tCola = 0; 
                                    cola2.add(tCola);
                                    if((tAhora) <= (t1))
                                    {
                                        TiempoCola = TiempoCola +tCola;
                                        tTServicio = tTServicio + t2;
                                        tiempoCliente =  tCola + tTServicio;
                                        tTotal = tTotal + tiempoCliente;
                                        clientes = cliente;
                                        System.out.println("    El cliente" +cliente+" ha sido añadido a la cola 2");
                                        System.out.println("    Su tiempo en la cola es de " +tCola+" minutos\n");
                                        System.out.println("    El tiempo de transacción del cliente "+cliente+" es de "+t2+" minutos.\n");
                                    }
                                    else if (tAhora > (t1))
                                    {
                                        tCola = (tAhora - t1);
                                        TiempoCola = TiempoCola + tCola;
                                        tTServicio = tTServicio + t2;
                                        tTotal = tTotal + tiempoCliente;
                                        clientes = cliente;
                                        System.out.println("    El cliente" +cliente+" ha sido añadido a la cola 2");
                                        System.out.println("    Su tiempo en la cola es de " +tCola+" minutos\n");
                                        System.out.println("    El tiempo de transacción del cliente "+cliente+" es de "+t2+" minutos.\n");
                                    }
                                }
                                else if(cola3.size() < cola1.size() && cola3.size() < cola2.size() && cola3.size() <= cola4.size() )
                                {
                                    tCola = 0;
                                    cola3.add(tCola);
                                    if((tAhora) <= (t1))
                                    {
                                        TiempoCola = TiempoCola + tCola;
                                        tTServicio = tTServicio + t2;
                                        tiempoCliente =  tCola + tTServicio;
                                        tTotal = tTotal + tiempoCliente;
                                        clientes = cliente;
                                        System.out.println("    El cliente" +cliente+" ha sido añadido a la cola 3");
                                        System.out.println("    Su tiempo en la cola es de " +tCola+" minutos\n");
                                        System.out.println("    El tiempo de transacción del cliente "+cliente+" es de "+t2+" minutos.\n");
                                    }
                                    else if (tAhora > (t1))
                                    {
                                        tCola = (tAhora - t1);
                                        TiempoCola = TiempoCola + tCola;
                                        tTServicio = tTServicio + t2;
                                        tTotal = tTotal + tiempoCliente;
                                        clientes = cliente;
                                        System.out.println("    El cliente" +cliente+" ha sido añadido a la cola 3");
                                        System.out.println("    Su tiempo en la cola es de " +tCola+" minutos\n");
                                        System.out.println("    El tiempo de transacción del cliente "+cliente+" es de "+t2+" minutos.\n");
                                    }
                                }
                                else if(cola4.size() < cola1.size() && cola4.size() < cola2.size() && cola4.size() < cola3.size() )
                                {
                                    tCola = 0;
                                    cola4.add(tCola);
                                    if((tAhora) <= (t1))
                                    {
                                        TiempoCola = TiempoCola + tCola;
                                        tTServicio = tTServicio + t2;
                                        tiempoCliente =  tCola + tTServicio;
                                        tTotal = tTotal + tiempoCliente;
                                        clientes = cliente;
                                        System.out.println("    El cliente" +cliente+" ha sido añadido a la cola 4");
                                        System.out.println("    Su tiempo en la cola es de " +tCola+" minutos\n");
                                        System.out.println("    El tiempo de transacción del cliente "+cliente+" es de "+t2+" minutos.\n");
                                    }
                                    else if (tAhora > (t1))
                                    {
                                        tCola = (tAhora - t1);
                                        TiempoCola = TiempoCola + tCola;
                                        tTServicio = tTServicio + t2;
                                        tTotal = tTotal + tiempoCliente;
                                        clientes = cliente;
                                        System.out.println("    El cliente" +cliente+" ha sido añadido a la cola 4");
                                        System.out.println("    Su tiempo en la cola es de " +tCola+" minutos\n");
                                        System.out.println("    El tiempo de transacción del cliente "+cliente+" es de "+t2+" minutos.\n");
                                    }
                                }
                               System.out.println("      Presione ENTER para continuar");
                               teclado.nextLine();
                               tAhora = t1+t2;
                               cliente ++;
                            }
                        }
                    }
                    break;
                    
                case 2:
                    if(t1 ==0)
                    {
                        System.out.println("     Debe ingresar clientes para poder habilitar esta opcion.\n      Presione ENTER para continuar");
                        teclado.nextLine();
                    }
                    
                    
                       
                    break;
                    
                case 3:
                    if(t1 ==0)
                    {
                        System.out.println("     Debe ingresar clientes para poder habilitar esta opcion.\n      Presione ENTER para continuar");
                        teclado.nextLine();
                    }
                    else
                    {
                        int tiCola = TiempoCola.intValue(); 
                        tPCola = tiCola/clientes; 
                        tPServicio = tTServicio/clientes;
                         tPTotal = tTotal/clientes;
                         System.out.println("\n   El tiempo promedio que un cliente pasa en el banco es: "+tPTotal+" minutos");
                         System.out.println("\n   El tiempo promedio que un cliente pasa haciendo cola es: "+tPCola+" minutos");
                         System.out.println("\n   El tiempo promedio que un cliente pasa haciendo una transacción es: "+tPServicio+" minutos");
                   
                          System.out.println("\n    Presione ENTER para continuar");
                        teclado.nextLine();
                    }
                    break;
                    
                case 4://fin del programa
                    System.out.println("Fin del programa");
                    break;
                default:
                    System.out.println("ERROR: Ingrese un numero del 1 al 4.");
                    System.out.println("\n      Presione ENTER para continuar");
                    teclado.nextLine();
               
            }
            
        }while (opcion!=4);
       
    }
    
      //menu utilizado para indicar distintas opciones al usuario
     public static void menu()
    {
        System.out.println();
        System.out.println("\n------------SIMULACION DE ATENCION A CLIENTES EN UN BANCO-----------\n");
        System.out.println("             -------    MENU INTERACTIVO    -------\n");
        System.out.println("          | 1. Ingreso de clientes                  |");
        System.out.println("          | 2. Desarrollo de eventos                |");
        System.out.println("          | 3. Ver promedios de tiempo              |");
        System.out.println("          | 4. Salir del programa                   |");
    }
     
    //---------------------------------------------------------------------------------
     
    //metodo utilizado como programacion defensiva al momento de pedir datos al usuario
    public static double obtenerNum(String mensaje, boolean mostrar)
    {
        Scanner teclado=new Scanner (System.in);
        double num=-1;
        
        System.out.print(mensaje);
        try
        {
            num=teclado.nextDouble();
        }
        catch(InputMismatchException exception)
        {
            if (mostrar)
                System.out.println("\nError: este dato es invalido.\n");
        }
        finally
        {
            teclado.nextLine(); //atrapar el enter
        }
        return num;
    }
}
